package legacy

import (
	"encoding/binary"
	"fmt"
	
	"inkjet168x-sdk-go/sdk/protocol/common"
)

// calculateChecksum 计算CRC16校验和
func (p *Packet) calculateChecksum() uint16 {
	// 创建一个临时缓冲区，包含除校验和和停止位之外的所有数据
	tempLen := int(p.PacketLength) - ChecksumSize - StopMarkerSize
	buf := make([]byte, tempLen)
	offset := 0
	
	// 起始位到Y坐标的所有固定字段
	copy(buf[offset:offset+4], p.StartMarker[:])
	offset += 4
	binary.LittleEndian.PutUint16(buf[offset:offset+2], p.Sequence)
	offset += 2
	buf[offset] = p.PacketType
	offset += 1
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.PacketLength)
	offset += 4
	copy(buf[offset:offset+32], p.FontName[:])
	offset += 32
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.FontSize)
	offset += 4
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.FontWidth)
	offset += 4
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.CharSpacing)
	offset += 4
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.Rotation)
	offset += 4
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.Bold)
	offset += 4
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.Italic)
	offset += 4
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.Style)
	offset += 4
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.XCoord)
	offset += 4
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.YCoord)
	offset += 4
	
	// 文本内容
	copy(buf[offset:offset+len(p.Text)], p.Text)
	offset += len(p.Text)
	
	// 保留字节
	copy(buf[offset:offset+4], p.Reserved[:])
	
	// 使用用户提供的CRC16算法计算校验和
	return common.CalculateChecksum(buf)
}

// String 返回数据包的字符串表示
func (p *Packet) String() string {
	fontName := string(p.FontName[:])
	// 去除字体名称中的零字节
	for i, b := range fontName {
		if b == 0 {
			fontName = fontName[:i]
			break
		}
	}
	
	return fmt.Sprintf("Packet{Seq: %d, Font: %s, Size: %d, Width: %d, Text: %q, Pos: (%d,%d)}",
		p.Sequence, fontName, p.FontSize, p.FontWidth, string(p.Text), p.XCoord, p.YCoord)
}

// GetFontName 获取字体名称（去除零字节）
func (p *Packet) GetFontName() string {
	fontName := string(p.FontName[:])
	for i, b := range fontName {
		if b == 0 {
			return fontName[:i]
		}
	}
	return fontName
}

// GetText 获取文本内容
func (p *Packet) GetText() string {
	return string(p.Text)
}

// IsBold 检查是否加粗
func (p *Packet) IsBold() bool {
	return p.Bold != 0
}

// IsItalic 检查是否斜体
func (p *Packet) IsItalic() bool {
	return p.Italic != 0
}